#include "GenerarRecibo.h"
#include "ui_GenerarRecibo.h"

extern QSqlDatabase enjoylifedb;
CCReciboSqlTableModel *reciboCC_model;
extern QSqlRelationalTableModel *cuenta_corriente_model;

GenerarRecibo::GenerarRecibo(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::GenerarRecibo)
{
    ui->setupUi(this);
    setWindowIcon(QIcon("://Icons/logo_principal.png"));
    setWindowTitle("Generación del Recibo");
    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);
    setWindowModality(Qt::WindowModal);

    reciboCC_model = new CCReciboSqlTableModel(this,enjoylifedb);
    reciboCC_model->setTable("cuenta_corriente");

    CargarClientes();

    ui->mes->addItem(" - Mes - ");
    ui->mes->addItem("Enero");
    ui->mes->addItem("Febrero");
    ui->mes->addItem("Marzo");
    ui->mes->addItem("Abril");
    ui->mes->addItem("Mayo");
    ui->mes->addItem("Junio");
    ui->mes->addItem("Julio");
    ui->mes->addItem("Agosto");
    ui->mes->addItem("Septiembre");
    ui->mes->addItem("Octubre");
    ui->mes->addItem("Noviembre");
    ui->mes->addItem("Diciembre");
    ui->mes->setCurrentIndex(QDate::currentDate().month());

    ui->anio->addItem(" - Año - ");
    for (int i = QDate::currentDate().year()-1; i < QDate::currentDate().year() + 50; i++)
        ui->anio->addItem(QString::number(i));

    ui->anio->setCurrentIndex(ui->anio->findData(QString::number(QDate::currentDate().year()),Qt::DisplayRole));

//    RefreshCCView();
    directorioPersonalizado = false;

    connect(ui->lista_cliente,SIGNAL(currentTextChanged(QString)),this,SLOT(RefreshCCView()));
    connect(ui->mes,SIGNAL(currentIndexChanged(int)),this,SLOT(CambiarMes()));
    connect(ui->anio,SIGNAL(currentIndexChanged(int)),this,SLOT(CambiarAnio()));
    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(close()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(on_guardarBtn_clicked()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

GenerarRecibo::GenerarRecibo(QWidget *parent, QString raz_soc) :
    QWidget(parent),
    ui(new Ui::GenerarRecibo)
{
    ui->setupUi(this);
    razon_social = raz_soc;
    setWindowIcon(QIcon("://Icons/logo_principal.png"));
    setWindowTitle("Generación del Recibo");
    setWindowFlags(Qt::WindowCloseButtonHint);
    setWindowModality(Qt::WindowModal);

//    ui->label_cliente->setText(razon_social);

    reciboCC_model = new CCReciboSqlTableModel(this,enjoylifedb);
    reciboCC_model->setTable("cuenta_corriente");

    ui->mes->addItem(" - Mes -");
    ui->mes->addItem("Enero");
    ui->mes->addItem("Febrero");
    ui->mes->addItem("Marzo");
    ui->mes->addItem("Abril");
    ui->mes->addItem("Mayo");
    ui->mes->addItem("Junio");
    ui->mes->addItem("Julio");
    ui->mes->addItem("Agosto");
    ui->mes->addItem("Septiembre");
    ui->mes->addItem("Octubre");
    ui->mes->addItem("Noviembre");
    ui->mes->addItem("Diciembre");
    ui->mes->setCurrentIndex(QDate::currentDate().month());

    //    ui->anio->addItem(" - Año -");
    for (int i = QDate::currentDate().year()-1; i < QDate::currentDate().year() + 50; i++)
        ui->anio->addItem(QString::number(i));

    ui->anio->setCurrentIndex(ui->anio->findData(QString::number(QDate::currentDate().year()),Qt::DisplayRole));

    RefreshCCView();

    connect(ui->mes,SIGNAL(currentIndexChanged(int)),this,SLOT(CambiarMes()));
    connect(ui->anio,SIGNAL(currentIndexChanged(int)),this,SLOT(CambiarAnio()));
    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(close()));
}

GenerarRecibo::~GenerarRecibo()
{
    delete ui;
}

void GenerarRecibo::CargarClientes()
{
    QSqlQuery *query = new QSqlQuery(enjoylifedb);

    if (! query->exec("select razon_social from cliente order by razon_social")) {
        QMessageBox::critical(this,"Error","No se pueden recuperar los cliente, intente nuevamente");
        return;
    }

    ui->lista_cliente->clear();
    ui->lista_cliente->addItem("- Elija Cliente -");

    while (query->next())
        ui->lista_cliente->addItem(query->value(0).toString());

    ui->lista_cliente->setCurrentIndex(0);
}

void GenerarRecibo::CambiarMes()
{
    RefreshCCView();
}

void GenerarRecibo::CambiarAnio()
{
    RefreshCCView();
}

void GenerarRecibo::RefreshCCView()
{
    if (ui->mes->currentIndex() > 0 && ui->anio->currentIndex() > 0) {
        QDate date;
        date.setDate(ui->anio->currentText().toInt(),ui->mes->currentIndex(),QDate::currentDate().day());

        QString formatMonth = "MM";
        QString formatYear = "yyyy";
        QString month = date.toString(formatMonth);
        QString year = date.toString(formatYear);

        QString filtro_recibo;
        filtro_recibo.append("cc_razon_social = '").append(ui->lista_cliente->currentText()).append("' and ");
        filtro_recibo.append("date_part('month', fecha_pago) = '").append(month).append("' and ");
        filtro_recibo.append("date_part('year', fecha_pago) = '").append(year).append("' and ");
        filtro_recibo.append("estado_deuda ='Pagó'");

        qDebug() << "Filtro recibo: " << filtro_recibo;

        reciboCC_model->setTable("cuenta_corriente");
        reciboCC_model->filter().clear();
        reciboCC_model->setFilter(filtro_recibo);

        if (!reciboCC_model->select()) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.commit();

        reciboCC_model->setHeaderData(1,Qt::Horizontal,"Razón Social");
        reciboCC_model->setHeaderData(2,Qt::Horizontal,"Tipo de Cobro");
        reciboCC_model->setHeaderData(3,Qt::Horizontal,"Concepto");
        reciboCC_model->setHeaderData(9,Qt::Horizontal,"Fecha Pagó");
        reciboCC_model->setHeaderData(11,Qt::Horizontal,"Monto Pagado");

        ui->items_view->setModel(reciboCC_model);

        ui->items_view->hideColumn(0);
        ui->items_view->hideColumn(4);
        ui->items_view->hideColumn(5);
        ui->items_view->hideColumn(6);
        ui->items_view->hideColumn(7);
        ui->items_view->hideColumn(8);
        ui->items_view->hideColumn(10);

        ui->items_view->setCornerButtonEnabled(true);
        ui->items_view->setAlternatingRowColors(true);
        ui->items_view->setGridStyle(Qt::SolidLine);
        ui->items_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
        ui->items_view->setWordWrap(true);
        ui->items_view->setSortingEnabled(false);
        ui->items_view->sortByColumn(9, Qt::AscendingOrder);
        ui->items_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    }
}

void GenerarRecibo::on_guardarBtn_clicked()
{
    QDir directorio;

    if (!directorioPersonalizado) {
        QDate date;
        QString formatoFecha = "ddMMyyyy";
        QString fecha = date.currentDate().toString(formatoFecha);

        path = directorio.currentPath() + "/Recibos/" + fecha + "/";
        directorio.setPath(path);
    } else {
        directorioPersonalizado = false;
        directorio.setPath(path);
    }

    if (!directorio.exists())
        directorio.mkpath(path);

    QModelIndexList indexes = ui->items_view->selectionModel()->selectedRows();

    if (indexes.size() > 0) {

        QString report_name = "Recibo_";
        report_name.append(ui->lista_cliente->currentText());
        report_name.append("_");
        switch (ui->mes->currentIndex()) {
        case 1:
            report_name.append("Enero");
            break;
        case 2:
            report_name.append("Febrero");
            break;
        case 3:
            report_name.append("Marzo");
            break;
        case 4:
            report_name.append("Abril");
            break;
        case 5:
            report_name.append("Mayo");
            break;
        case 6:
            report_name.append("Junio");
            break;
        case 7:
            report_name.append("Julio");
            break;
        case 8:
            report_name.append("Agosto");
            break;
        case 9:
            report_name.append("Septiembre");
            break;
        case 10:
            report_name.append("Octubre");
            break;
        case 11:
            report_name.append("Noviembre");
            break;
        case 12:
            report_name.append("Diciembre");
            break;
        }
        report_name.append("_").append(ui->anio->currentText()).append(".pdf");

        QPrinter* print = new QPrinter(QPrinter::HighResolution);
        print->setOutputFormat(QPrinter::PdfFormat);
        print->setColorMode(QPrinter::Color);
        QString final_path;
        final_path.append(path).append("/").append(report_name);
        print->setOutputFileName(final_path);

        QTextDocument *document = new QTextDocument;

        QTextCursor cursor(document);
        cursor.movePosition(QTextCursor::Start);

        QTextImageFormat picture1;
        picture1.setName("://Images/membrete recibo-15.png");
        picture1.setWidth(630);
        picture1.setHeight(120);
        cursor.insertImage(picture1,QTextFrameFormat::InFlow);

        cursor.insertBlock();
        cursor.insertBlock();
        cursor.insertBlock();

        QTextCharFormat header_format;
        QFont headerfont;
        headerfont.setFamily("Helvetica57");
        headerfont.setBold(true);
        header_format.setFont(headerfont);

        cursor.insertText("Fecha: ",header_format);

        QTextCharFormat text_format;
        QFont textfont;
        textfont.setFamily("Helvetica57-Condensed");
        text_format.setFont(textfont);

        QString str_date = QString::number(QDate::currentDate().day()).append("/");
        str_date.append(QString::number(QDate::currentDate().month())).append("/");
        str_date.append(QString::number(QDate::currentDate().year()));
        cursor.insertText(str_date,text_format);

        cursor.insertBlock();
        cursor.insertBlock();

        cursor.insertText("Atención: ",header_format);
        cursor.insertText("Enjoy Life.",text_format);

        cursor.insertBlock();
        cursor.insertBlock();

        cursor.insertText("Cliente: ",header_format);
        cursor.insertText(ui->lista_cliente->currentText(),text_format);

        cursor.insertBlock();
        cursor.insertBlock();
        cursor.insertBlock();

        QTextImageFormat picture2;
        picture2.setName("://Images/linea-16.png");
        picture2.setWidth(630);
        picture2.setHeight(10);
        cursor.insertImage(picture2,QTextFrameFormat::InFlow);

        cursor.insertBlock();
        cursor.insertBlock();
        cursor.insertBlock();

        QTextCharFormat text_italic_format;
        QFont textitfont;
        textitfont.setFamily("Helvetica57-Condensed");
        textitfont.setItalic(true);
        text_italic_format.setFont(textitfont);

        cursor.insertText("De nuestra mayor consideración:",text_italic_format);

        cursor.insertBlock();
        cursor.insertBlock();

        cursor.insertText("\t \tSe detalla el recibo de lo abonado al día de la fecha para los servicios contratados.",text_italic_format);

        cursor.insertBlock();
        cursor.insertBlock();

        cursor.insertText("Resumen: ",header_format);

        cursor.insertBlock();
        cursor.insertBlock();
        cursor.insertBlock();

        // Se define la tabla de los detalles del cupón
        QTextTableFormat table_format;
        table_format.setHeaderRowCount(1);
        table_format.setBorderStyle(QTextFrameFormat::BorderStyle_Groove);
        table_format.setCellSpacing(0);
        table_format.setCellPadding(3);
        table_format.setWidth(QTextLength(QTextLength::PercentageLength, 100));
        cursor.movePosition(QTextCursor::StartOfBlock);

        cursor.insertTable(indexes.count() + 3,3,table_format);

        QTextCharFormat text_header_table;
        QFont textheaderfont;
        textheaderfont.setFamily("Helvetica57");
        textheaderfont.setBold(true);
        text_header_table.setFont(textheaderfont);
        QPen p;
        p.setColor(QColor(0,159,52));
        text_header_table.setTextOutline(p);
        text_header_table.setTableCellRowSpan(5);

        cursor.insertText("Concepto",text_header_table);
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Fecha del Movimiento",text_header_table);
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("Monto",text_header_table);

        cursor.movePosition(QTextCursor::NextCell);

        // Se agregan los datos de las filas que se seleccionaron
        double suma_total = 0;

        for (int i = 0; i < indexes.count(); ++i) {
            QModelIndex id = indexes.at(i);

            int id_cc = reciboCC_model->index(id.row(),0).data().toInt();

            cursor.insertText(reciboCC_model->index(id.row(),3).data().toString(),text_format);
            cursor.movePosition(QTextCursor::NextCell);
            QDate fecha_mov = reciboCC_model->index(id.row(),5).data().toDate();

            QString str_month;

            switch (fecha_mov.month()) {
            case 1:
                str_month.append("Enero");
                break;
            case 2:
                str_month.append("Febrero");
                break;
            case 3:
                str_month.append("Marzo");
                break;
            case 4:
                str_month.append("Abril");
                break;
            case 5:
                str_month.append("Mayo");
                break;
            case 6:
                str_month.append("Junio");
                break;
            case 7:
                str_month.append("Julio");
                break;
            case 8:
                str_month.append("Agosto");
                break;
            case 9:
                str_month.append("Septiembre");
                break;
            case 10:
                str_month.append("Octubre");
                break;
            case 11:
                str_month.append("Noviembre");
                break;
            case 12:
                str_month.append("Diciembre");
                break;
            }

            str_month.append(" de ").append(QString::number(fecha_mov.year()));

            cursor.insertText(str_month,text_format);

            cursor.movePosition(QTextCursor::NextCell);
            double monto_mes = reciboCC_model->index(id.row(),11).data().toDouble();
            suma_total = suma_total + monto_mes;
            QString str_monto = "$ ";
            str_monto.append(QString("%1").arg(monto_mes, 0, 'f', 2));
            cursor.insertText(str_monto,text_format);

            cursor.movePosition(QTextCursor::NextCell);


            // se edita la db y se pone SI en la columna recibo
            QString filter = "id_cuenta_cor = '";
            filter.append(QString::number(id_cc)).append("'");

            cuenta_corriente_model->setFilter(filter);

            enjoylifedb.transaction();
            if (!(cuenta_corriente_model->select())) {
                QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros necesarios de cuenta corriente, intentelo manualmente.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();

            if (cuenta_corriente_model->rowCount() == 1) {
                QSqlRecord record = cuenta_corriente_model->record(0);

                record.setValue("cc_razon_social",reciboCC_model->index(id.row(),1).data().toString());

                record.setValue("tipo_cobro",reciboCC_model->index(id.row(),2).data().toString());

                record.setValue("concepto",reciboCC_model->index(id.row(),3).data().toString());

                record.setValue("debe",QString("%1").arg(reciboCC_model->index(id.row(),4).data().toDouble(),0,'f',2));

                record.setValue("desde",reciboCC_model->index(id.row(),5).data().toDate());

                record.setValue("estado_deuda",reciboCC_model->index(id.row(),6).data().toString());

                record.setValue("tipo_moneda",reciboCC_model->index(id.row(),7).data().toString());

                record.setValue("id_moneda",reciboCC_model->index(id.row(),8).data().toString());

                record.setValue("fecha_pago",reciboCC_model->index(id.row(),9).data().toDate());

                record.setValue("recibo_generado","SI");

                record.setValue("monto_pagado",QString("%1").arg(reciboCC_model->index(id.row(),11).data().toDouble(),0,'f',2));

                cuenta_corriente_model->setRecord(0, record);

                enjoylifedb.transaction();
                if (!cuenta_corriente_model->submitAll()) {
                    QString error = cuenta_corriente_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados en Cta. Cte., intentelo de nuevo."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
            }
        }

        cursor.movePosition(QTextCursor::NextRow);

        QTextCharFormat text_bold_format;
        QFont textbfont;
        textbfont.setFamily("Helvetica57-Condensed");
        textbfont.setBold(true);
        text_bold_format.setFont(textbfont);
        text_format.setFont(textfont);

        cursor.insertText("Total Pagado",text_bold_format);
        cursor.movePosition(QTextCursor::NextCell);
        cursor.insertText("                               ",text_bold_format);
        cursor.movePosition(QTextCursor::NextCell);

        QString total_pagar = "$ ";
        total_pagar.append(QString("%1").arg(suma_total, 0, 'f', 2));
        cursor.insertText(total_pagar,text_bold_format);

        cursor.movePosition(QTextCursor::End);

        cursor.insertBlock();
        cursor.insertBlock();
        cursor.insertBlock();
        cursor.insertBlock();

        cursor.insertText("\t \t \t \t \t \t                Saludamos atentamente.",text_format);

        cursor.insertBlock();
        cursor.insertBlock();

        cursor.insertText("\t \t \t \t \t \t \t    Enjoy Life",header_format);

        cursor.insertBlock();
        cursor.insertBlock();

        QTextCharFormat text_under_format;
        QFont textunfont;
        textunfont.setFamily("Helvetica57-Condensed");
        text_under_format.setFont(textunfont);
        text_under_format.setForeground(QBrush(Qt::blue));

        cursor.insertText("\t \t \t \t \t     ");
        cursor.insertText("www.enjoylife.com.ar",text_under_format);

        cursor.insertText("  |  contacto@enjoylife.com.ar", text_format);

        document->print(print);


        QMessageBox::information(this,"Información","El recibo se ha generado exitosamente");

//        close();
        LimpiarUI();

//        MandarMail();

    }
    else {
        QMessageBox::warning(this,"Información","No se han seleccionado ítems para incluir en el reporte");
        return;
    }
}

void GenerarRecibo::on_select_dir_btn_2_clicked()
{
    directorioPersonalizado = true;
    path = QFileDialog::getExistingDirectory(this, "Seleccione un directorio de salida", QCoreApplication::applicationDirPath(),QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
}

void GenerarRecibo::LimpiarUI()
{
    ui->lista_cliente->setCurrentIndex(0);
    ui->items_view->reset();
}

void GenerarRecibo::MandarMail()
{
//    mailto:iudith.m@zim.co.il?subject=my report&body=see attachment&attachment="/my_location_virtual_path/myfile.lis"
    QString fileName = "C:/Users/Diego/Desktop/reporte.txt";
    QDesktopServices::openUrl(QUrl("mailto:?subject=Probando &body=bodybodybody &attached=" + fileName));
//    QDesktopServices::openUrl(QUrl("mailto:?subject=&body=&attach=" + filename));

//    QString l_string = QFileDialog::getOpenFileName(this,tr("Open File"), QDir::currentPath());/*

//    QDesktopServices::openUrl(QUrl("mailto:? subject=Probando &body="+l_string+"&attach=\"" + l_string + "\""));*/
}
